﻿using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dominio;
using Persistencia;

namespace PersistenciaImplementacion
{
    class BrokerTanque:Broker
    {
        public override string GetSQLCreate()
        {
            return "INSERT INTO Tanque (descripcion, capacidad, litrosDisponibles, calidad, borrado,fechaCreacion,ultimaFechaLimpieza) VALUES (@desc, @capac, @litros, @calidad,@borrado,@fechaCreacion,@ultimaFechaLimpieza)SELECT SCOPE_IDENTITY()";
        }

        public override string GetSQLDelete()
        {
            return "UPDATE Tanque SET borrado = 1 where idTanque = @idTanque";
        }

        public override string GetSQLUpdate()
        {
            return "UPDATE Tanque SET litrosDisponibles=@litros, ultimaFechaLimpieza = @ultimaFechaLimpieza, calidad = @calidad, borrado= @borrado  WHERE idTanque = @idTanque";
        }

        public override string GetSQLSelect()
        {
            return "Select * from Tanque t left join TanqueAceite ta on t.idTanque = ta.idTanqueAceite" +
                    " left join TanqueAgua tag on t.idTanque = tag.idTanqueAgua" +
                    " left join TanqueCombustible tc on t.idTanque = tc.idTanqueCombustible" +
                    " where t.borrado=0";
        }

        public override ObjetoPersistible ReaderToObject(DbDataReader reader)
        {
            string descripcion = reader["descripcion"].ToString();
            int capacidad = Int32.Parse(reader["capacidad"].ToString());
            int litrosDisponibles = Int32.Parse(reader["litrosDisponibles"].ToString());
            int calidad = Int32.Parse(reader["calidad"].ToString());
            int idTanque = Int32.Parse(reader["idTanque"].ToString());
            DateTime fechaCreacion = DateTime.Parse(reader["fechaCreacion"].ToString());
            DateTime ultimaFechaLimpieza = DateTime.Parse(reader["ultimaFechaLimpieza"].ToString());
        
            if (reader["idTanqueAgua"].ToString() != "")
            { //Tanque de Agua
                string ubicacion = reader["localizacion"].ToString();
                Tanque tanque = new TanqueAgua(descripcion, capacidad, ubicacion, calidad);
                tanque.LitrosDisponibles = litrosDisponibles;
                tanque.idTanque = idTanque;
                tanque.FechaCreacion = fechaCreacion;
                tanque.UltimaFechaLimpieza = ultimaFechaLimpieza;
                Sistema.GetSistema().AgregarTanque(tanque);
                return tanque;
            }
            else if (reader["idTanqueAceite"].ToString() != "")
            { //Tanque Aceite
                int viscosidad = Int32.Parse(reader["viscosidad"].ToString());
                Tanque tanque = new TanqueAceite(descripcion, capacidad, viscosidad, calidad);
                tanque.LitrosDisponibles = litrosDisponibles;
                tanque.idTanque = idTanque;
                tanque.FechaCreacion = fechaCreacion;
                tanque.UltimaFechaLimpieza = ultimaFechaLimpieza;
                Sistema.GetSistema().AgregarTanque(tanque);
                return tanque;
            }
            else if (reader["idTanqueCombustible"].ToString() != "")
            { //Tanque Combustible
                string contenido = reader["tipo"].ToString();
                Contenido cont = new Contenido(contenido);
                Tanque tanque = new TanqueCombustible(descripcion, capacidad, cont, calidad);
                tanque.LitrosDisponibles = litrosDisponibles;
                tanque.idTanque = idTanque;
                tanque.FechaCreacion = fechaCreacion;
                tanque.UltimaFechaLimpieza = ultimaFechaLimpieza;
                Sistema.GetSistema().AgregarTanque(tanque);
                return tanque;
            }
            return null;
        }

        public override void LoadReferences(SqlCommand comando, ObjetoPersistible obj)
        {
            SqlParameter descripcion = new SqlParameter("@desc", (obj as Tanque).Descripcion);
            SqlParameter capacidad = new SqlParameter("@capac", (obj as Tanque).Capacidad);
            SqlParameter litros = new SqlParameter("@litros", (obj as Tanque).LitrosDisponibles);
            SqlParameter calidad = new SqlParameter("@calidad", (obj as Tanque).Calidad);
            SqlParameter borrado = new SqlParameter("@borrado", (obj as Tanque).Borrado);
            SqlParameter fechaCreacion = new SqlParameter("@fechaCreacion", (obj as Tanque).FechaCreacion);
            SqlParameter ultimaFechaLimpieza = new SqlParameter("@ultimaFechaLimpieza", (obj as Tanque).UltimaFechaLimpieza);
            comando.Parameters.Add(descripcion);
            comando.Parameters.Add(capacidad);
            comando.Parameters.Add(litros);
            comando.Parameters.Add(calidad);
            comando.Parameters.Add(borrado);
            comando.Parameters.Add(fechaCreacion);
            comando.Parameters.Add(ultimaFechaLimpieza);
        }

        public override void LoadReferencesWhere(SqlCommand comando, ObjetoPersistible obj)
        {
            SqlParameter idTanque = new SqlParameter("@idTanque", (obj as Tanque).idTanque);
            SqlParameter litros = new SqlParameter("@litros", (obj as Tanque).LitrosDisponibles);
            SqlParameter calidad = new SqlParameter("@calidad", (obj as Tanque).Calidad);
            SqlParameter borrado = new SqlParameter("@borrado", (obj as Tanque).Borrado);
            SqlParameter ultimaFechaLimpieza = new SqlParameter("@ultimaFechaLimpieza", (obj as Tanque).UltimaFechaLimpieza);

            comando.Parameters.Add(idTanque);
            comando.Parameters.Add(litros);
            comando.Parameters.Add(calidad);
            comando.Parameters.Add(borrado);
            comando.Parameters.Add(ultimaFechaLimpieza);
            
        }

        public override String InsertarHijos(object objeto, ObjetoPersistible obj)
        {
            Tanque tan = (Tanque)obj;
            tan.idTanque = Int32.Parse(objeto.ToString());

            if (obj is TanqueCombustible)
            {   
                return "INSERT INTO TanqueCombustible (idTanqueCombustible, tipo) VALUES (" + objeto.ToString() + ",'" + (obj as TanqueCombustible).contenido + "')";
            }
            else if (obj is TanqueAgua)
            {
                return "INSERT INTO TanqueAgua (idTanqueAgua, localizacion) VALUES (" + objeto.ToString() + ",'" + (obj as TanqueAgua).localizacion + "')";
            }
            else if (obj is TanqueAceite)
            {
                return "INSERT INTO TanqueAceite (idTanqueAceite, viscosidad) VALUES (" + objeto.ToString() + ",'" + (obj as TanqueAceite).viscosidad + "')";
            }
            return null;
        }

    }
}
